package designpatterns.strategy;

import java.util.Arrays;
import java.util.Comparator;

/**
 * 策略模式理解：要做一件事情，需要用不同的策略去做，
 * 这里吧不同的策略抽象成一个接口，如果接口只有一个参数可以用函数式编程
 * @ Description：排序器
 */
public class Sorter {

    public static <T> void sort(T[] arr, Comparator<T> comparator) {
        for (int i = 0; i < arr.length - 1; i++) {
            int minPos = i;
            for (int j = i + 1; j < arr.length; j++) {
                minPos = comparator.compare(arr[minPos], arr[j]) > 0 ? j : minPos;
            }
            swap(arr, i, minPos);
        }
    }

    private static <T> void swap(T[] arr, int i, int j) {
        T temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        Integer[] iArr = new Integer[]{1, 2, 33, 4, 56, 8};
        System.out.println(Arrays.toString(iArr));
        sort(iArr, (i1, i2) -> {
            if (i1 > i2) {
                return 1;
            } else if (i1 < i2) {
                return -1;
            } else {
                return 0;
            }
        });
        System.out.println(Arrays.toString(iArr));

        Float[] fArr = new Float[] {11.1f, 12.2f, 5.5f, 3.3f, 4.4f};
        System.out.println(Arrays.toString(fArr));
        sort(fArr, (f1, f2) -> {
            if (f1 > f2) {
                return 1;
            } else if (f1 < f2) {
                return -1;
            } else {
                return 0;
            }
        });
        System.out.println(Arrays.toString(fArr));
    }
}
